package cn.com.utils;

import java.util.Stack;
import java.util.UUID;

/**
 * 计时器计数util
 * 一个使用 InheritableThreadLocal 封装的计时工具类，允许子线程继承父线程的计时信息。
 *
 * @author LiuGuodong
 * @date 2024/01/23
 */
public class TimerCountUtil {


    /**
     * 存放统计时间的key
     */
    private static final Stack<String> KEY_STACK = new Stack<>();

    /**
     * 开始计时。
     */
    public static void start() {
        String name = getName();
        KEY_STACK.push(name);
        ThreadLocalUtil.set(name, System.nanoTime());
    }

    /**
     * 获取名称
     *
     * @return {@link String}
     */
    private static String getName() {
        return Thread.currentThread().getName() + UUID.randomUUID();
    }

    /**
     * 结束计时，并输出总耗时。
     *
     * @throws IllegalStateException 如果计时器尚未启动，则抛出异常。
     */
    public static long stop() {
        long endTime = System.nanoTime();
        Long startTime;
        String name;
        if (KEY_STACK.empty() || (startTime = (Long) ThreadLocalUtil.get(name = KEY_STACK.pop())) == null) {
            return -1;
        }
        long elapsedTime = endTime - startTime;
        clear(name);
        return elapsedTime;
    }

    /**
     * 清空计时器信息。
     */
    private static void clear(String name) {
        ThreadLocalUtil.remove(name);
    }


}
